Routing w Linuxie
Gdy już złożycie serwer ze starych części należy kupić do niego dwie karty sieciowe (do każdej sieci jedna). Konfiguracja Linuxa dla niedoświadczonego użytkownika jest dość trudna, więc zakładam, że czytający ten artykuł ma o tym pojęcie.
Podstawą łączenia dwóch sieci jest transmisja pakietów z jednej
karty sieciowej do drugiej. Nosi to nazwę tzw. routingu. Tabela routingu jest
automatycznie tworzona na podstawie parametrów kart sieciowych. Można ją obejrzeć
poleceniem /sbin/route. Jednak routing załatwia jedynie sprawę pakietów
adresowanych. Jednak wiele pakietów to tzw. broadcasty, czyli adresowane do wszystkich
(np. Microsoft Network, różne gierki używają tego do znajdywania serwerów, programy
do rozmawiania przez sieć, np. LANChat). Sprawą przenoszenia takich pakietów zajmuje się
tzw. bridging.
Są dwie możliwości łączenia sieci ze względu na adres IP. Można zmienić przedostatnią wartość w adresie sieci, np. 192.168.0.X i 193.168.1.X lub podzielić sieć 192.168.0.X na dwie sieci - 193.168.0.(0-127) oraz 193.168.0.(128-255). Drugie rozwiązanie jest bardziej uniwersalne ponieważ nie zmienia się klasa adresowa C w całej połączonej sieci, a niektóre programy nie tolerują klasy B (np. LANChat bez trybu override).
Podział klasy C IP na dwie części
| Segment pierwszy sieci | Segment drugi sieci | |
| Adresy IP | X.X.X.1-126 (zalecane 1 - serwer) |
X.X.X.129-254 (zalecane 129 - serwer) |
| Maska podsieci (netmask) | 255.255.255.128 | 255.255.255.128 |
| Broadcast | X.X.X.127 | X.X.X.255 |
| Sieć (network) | X.X.X.0 | X.X.X.128 |
By skonfigurować karty sieciowe edytujemy pliki /etc/sysconfig/network-scripts/ifcfg-eth0 i ifcfg-eth1 (w dystrybucji Red Hat). Oto przykładowy plik ifcfg-eth0 dla sieci z rozdzieloną klasą C:
DEVICE="eth0"
IPADDR="192.168.0.1" ; adres IP serwera
NETWORK="192.168.0.0" ; sieć [0-127]
NETMASK="255.255.255.128" ; mamy tylko połowę sieci więc 128 zamiast 0
BROADCAST="192.168.0.127" ; w połowicznej sieci broadcast ma się tak
ONBOOT="yes"
BOOTPROTO="none"
I analogiczny plik dla eth1:
DEVICE="eth1"
IPADDR="192.168.0.129" ; adres IP serwera (pierwszy dostępny w sieci 128)
NETWORK="192.168.0.128" ; sieć [128-255]
NETMASK="255.255.255.128"
BROADCAST="192.168.0.255" ; w tej połowicznej sieci broadcast ma się inaczej
ONBOOT="yes"
BOOTPROTO="none"
W komputerach w sieci trzeba ustawić bramkę (gateway) i tu wpisać
KONIECZNIE adres IP karty sieciowej serwera z naszej sieci, np. dla komputera o adresie
192.168.0.7 należy wpisać 192.168.0.1 (jeśli akurat .1 jest serwerem), a dla komputera
192.168.0.163 wpisać 192.168.0.129 (jeśli .129 to druga sieciówka serwera). Oczywiście
adresy, które tu przytaczam są przykładowe i nie narzucam adresu rozpoczynającego się
192.168.0, ponieważ może być inny, lecz ostatnia wartość w adresie IP jest
niesamowicie ważna. Należy też pamiętać by w pliku /etc/sysconfig/network wpisać
GATEWAYDEV="lo" i GATEWAY="127.0.0.1" by nie występowały inne
problemy. Po poprawnym skonfigurowaniu wszystkie pakiety (zarówno normalne jak i
broadcasty) powinny być poprawnie kierowane. Poprawność działania można sprawdzić z
poziomu systemu Windows za pomocą polecenia tracert (lub traceroute w Linuxie), które powinno pokazać trasę pakietów do
drugiej sieci poprzez serwer.
Uruchamianie dwóch interfejsów sieciowych
Aby kernel szukał następnego
interfejsu sieciowego gdy już znajdzie jeden do pliku /etc/lilo.conf dopisujemy następującą
linijkę
append = "ether=0,0,eth1"
lub ewentualnie gdy chcemy zrobić bridge'a obsługującego trzy karty sieciowe:
append = "ether=0,0,eth1
ether=0,0,eth2"
zwiekszając liczbę parametrów ether można dodać większą liczbę urządzeń
sieciowych. Jeżeli sterowniki kart sieciowych mamy skompilowane jako moduły wtedy
edytujemy plik /etc/conf.modules odpowiednio go modyfikując np:
alias eth0 ne
alias eth1 3c509
options ne irq=5 io=0x300
options ne irq=10 io=0x220
lub gdy mamy karty takiego samego typu:
alias eth0 ne
alias eth1 ne
options ne io=0x300,200
Warto zaznaczyć, że adresy IP są przydzielane dla urządzeń sieciowych, a nie dla hostów, tzn. że komputer z 3 kartami sieciowymi ma trzy adresy IP a jest jeden jako fizyczny host. Zarówno adresy sieci jak i adresy broadcast są specjalnymi adresami, ktorych hosty nie moga przyjmować.
Uruchamianie Bridge'a
Aby uruchomic bridge'a jądro systemu musimy skompilować wraz z opcją CONFIG_BRIDGE=y (jak na razie opcja ta jest w fazie eksperymentalnej) i oczywiście CONFIG_NET=y. Aby uruchomić bridge'a musimy zdobyć jego konfigurator, który można ściagnąć z ftp://shadow.cabi.net/pub/Linux (oraz mam nadzieję z LANZone). Ponieważ mamy bridge'a na interfejsach musimy nasłuchiwac wszystkich pakietów, także tych nieprzeznaczonych dla danej karty, aby to zrobić przełączmy interfejsy w tryb 'promisc':
ifconfig promisc eth0
ifconfig promisc eth1
itd
Bridge'a uruchamiamy poprzez jego konfigurator wpisując
brcfg -enable
Można także poeksperymentować włączając lub wyłączając porty:
brcfg -port 0 -disable / -enable
brcfg -port 1 -disable / -enable
Samo polecenie brcfg pokazuje w danej chwili raport. Jeżeli wszystko jest OK to na każdym z interfejsów powinien być inny ruch - sprawdzamy to poleceniem
tcpdump -i eth0
tcpdump -i eth1
Jeżeli chcemy zobaczyć pakiety, które przeszły przez bridge'a do drugiej karty z wewnętrznej sieci uruchamiamy:
tcpdump -i eth1 -e host (adres IP hosta)
Teraz jeżeli
wyślemy jakis pakiet do podanego hosta informacje o nim poda nam tcpdump.
Polecenia inicjalizujące bridge'a i przełączające karty w odpowiedni tryb można dodac
do rc.local aby uruchamiały sie za każdym razem po boocie.
Jeżeli przy uruchamianiu brcfg zobaczymy komunikat "ioctl(SIOCGIFBR) failed: Package not found" to znaczy, że zapomnieliśmy wkompilować w jądro opcji
bridge.
Piotr Kowalski goro@vc.pl
Mateusz Skoczewski melun@friko2.onet.pl